package com.mall.gateway.filter;

import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;

/**
 * 网关统一认证过滤器配置
 */
@Configuration
public class GlobalAuthFilter {
    
    /**
     * 注册Sa-Token全局过滤器
     */
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 拦截地址
                .addInclude("/**")
                // 开放接口
                .addExclude("/auth/login", "/auth/register", "/doc.html", "/webjars/**", "/swagger-resources/**", "/v3/api-docs/**")
                // 鉴权规则
                .setAuth(obj -> {
                    // 登录校验 - 拦截所有/user/服务的接口，并检查是否登录
                    SaRouter.match("/user/**", r -> StpUtil.checkLogin());
                    
                    // 权限校验 - 订单相关接口需要有order权限
                    SaRouter.match("/order/**", r -> StpUtil.checkPermission("order"));
                    
                    // 角色校验 - 产品管理接口需要管理员角色
                    SaRouter.match("/product/admin/**", r -> StpUtil.checkRole("admin"));
                })
                // 异常处理
                .setError(e -> {
                    HttpStatus status = HttpStatus.UNAUTHORIZED;
                    return SaReactorFilter.getResponse().status(status).bodyValue(e.getMessage());
                });
    }
} 